//Clase que controla el slider de fotografias
class Slider{
 
  ArrayList<String> imagenes;
  private int numImagenes;
  private int alto;
  private int separacionx,separaciony;
  private int posicion;
  private int imgAct;
  private float anchoImagen,altoImagen;
  private boolean cargado;
  private float desplazamiento=0;
  private PImage bg;
  private ArrayList<PImage> imagenesVisibles;
  private PImage imgActual;
  
    
  
  //Constructor
 public Slider(ArrayList<String> imagenes){
   this.imagenes = imagenes;
   this.numImagenes =imagenes.size();
  println(numImagenes); //(10 > imagenes.size() ? imagenes.size():10);
   this.alto = 100;
   this.separacionx = 20;
   this.separaciony=10;
   this.posicion = 0;
   this.imgAct=0;
   this.cargado = true;
 }
 //constructor
 public Slider(){
   this.alto = 100;
   this.separacionx=20;
   this.separaciony = 10;
   this.posicion = 0;
   this.imgAct=0;
   this.cargado=false;
   bg=loadImage("slider.png");
   this.imagenesVisibles = new ArrayList();
   this.desplazamiento=0;
 }
 //Funcion que se activa al mover el slider
 void moverSlider(int val){
  if(val!=desplazamiento){
    desplazamiento = val;
    actualizar();
  } 
}


 //Funcion que carga en el slider todas las imagenes
 void cargar(ArrayList<String> imagenes){
   this.imagenes = imagenes;
   this.numImagenes =  (10 > imagenes.size() ? imagenes.size():10);
   this.cargado = true;
   this.imgActual=(PImage)loadImage((String)imagenes.toArray()[0]);   
 }
 //Funcion que actualiza las imagenes del slider
 void actualizar(){
   if(cargado){
   anchoImagen = ((width-(this.separacionx * (this.numImagenes+1)))/this.numImagenes);
   altoImagen = (alto-this.separaciony*2);
   imagenesVisibles.clear();
   for(int i = (int)desplazamiento; i<(desplazamiento+10<imagenes.size()?desplazamiento+10:imagenes.size()) ;i++){
   PImage img = loadImage((String)imagenes.get(i));
   
   float newAlto = img.height;
   float newAncho = img.width;
   
   if(img.height > altoImagen){
    
    newAlto = altoImagen;
    newAncho =img.width*newAlto / img.height; 
   }
   if(newAncho > anchoImagen){
     float an = newAncho;    
     newAncho = anchoImagen;
     newAlto = newAlto*an / newAncho;
   }
  
   img.resize((int)newAncho,(int)newAlto);
   imagenesVisibles.add(img);
 }
 }
}
 //Funcion que muestra el slider
 void display(){
   image(bg,0,height-this.alto,width,this.alto);
   if(cargado){
   anchoImagen = ((width-(this.separacionx * (this.numImagenes+1)))/this.numImagenes);
   altoImagen = (alto-this.separaciony*2);
   for(int i = 0; i<imagenesVisibles.size();i++){
   int nImg = (int)((mouseX)/(anchoImagen+separacionx));
   if(mouseY >height - alto+separaciony && mouseY <height-separaciony && mouseX > anchoImagen*nImg + separacionx*(nImg+1) && nImg+posicion == i+posicion){
     PImage img = (PImage)imagenesVisibles.get(i);
     
   image((PImage)imagenesVisibles.get(i),(separacionx*(i+1)+(i*anchoImagen))-20,(height-alto+separaciony)-20,img.width+40,img.height+40);
   }
  else{
    PImage img = (PImage)imagenesVisibles.get(i);
     image((PImage)imagenesVisibles.get(i),separacionx*(i+1)+(i*anchoImagen),height-alto+separaciony,img.width,img.height);}
   }
 }
   }
   //funcion que se activa al presionar el mouse
boolean mousePressed(){
  if(mouseY >height - alto+separaciony && mouseY <height-separaciony){
   int nImg = (int)((mouseX)/(anchoImagen+separacionx)); 
   if(mouseX > anchoImagen*nImg + separacionx*(nImg+1)){
   imgAct =(int) (nImg+desplazamiento); 
   this.imgActual=loadImage((String)imagenes.get(imgAct));//imagenesVisibles.get(nImg);
   println("numero= "+nImg);
   return true;
   }
   return true;
  }
  return false;
}
//Getters
PImage getImagenActual(){
  return imgActual;
}
int getNumImagenActual(){
  return (int)(imgAct);
}
void setNumImagenActual(int num){
 imgAct=num; 
}
int getAlto(){
  return this.alto;
}
}
